package com.jusfoun.communication.dao;

import com.jusfoun.communication.model.User;
import com.jusfoun.communication.util.PageInfo;

import java.util.List;
import java.util.Set;

/**
 * @author player six
 * @email jslcylcy@163.com
 * @create 2017-12-12 16:44
 **/
public interface UserDao {
    /**
     * 生成用户 token
     *
     * @param appId
     * @param userName
     * @return
     */
    String generateToken(String appId, String userName);

    /**
     * 返回appId下所有的用户名称
     *
     * @return
     */
    List<String> listAllUserName(String appId);

    /**
     * 获取app下所有的标签数量
     *
     * @param appId
     * @return
     */
    long listTagCount(String appId);

    /**
     * 分页查询tag列表
     *
     * @param appId
     * @param pageInfo
     * @return
     */
    List<String> listTag(String appId, PageInfo pageInfo);

    /**
     * 获取app下所有的分组数量
     *
     * @param appId
     * @return
     */
    long listGroupCount(String appId);

    /**
     * 获取分页的分组列表
     *
     * @param appId
     * @param pageInfo
     * @return
     */
    List<String> listGroup(String appId, PageInfo pageInfo);

    /**
     * 获取指定分组下用户的数量
     *
     * @param appId
     * @param group
     * @return
     */
    long listGroupUserCount(String appId, String group);

    /**
     * 获取指定分组下分页的用户列表
     *
     * @param appId
     * @param group
     * @param pageInfo
     * @return
     */
    List<String> listGroupUser(String appId, String group, PageInfo pageInfo);

    /**
     * 获取分组下所有的用户
     *
     * @param appId
     * @param group
     * @return
     */
    Set<String> listGroupUser(String appId, String group);

    /**
     * 获取app下用户的数量
     *
     * @param appId
     * @return
     */
    long listUserCount(String appId);

    /**
     * app下用户的分页列表
     *
     * @param appId
     * @param pageInfo
     * @return
     */
    List<User> listUser(String appId, PageInfo pageInfo);

    /**
     * 获取指定tag下用户数量
     *
     * @param appId
     * @param tag
     * @return
     */
    long listTagUserCount(String appId, String tag);

    /**
     * 获取指定tag下用户的分页列表
     *
     * @param appId
     * @param tag
     * @param pageInfo
     * @return
     */
    List<String> listTagUser(String appId, String tag, PageInfo pageInfo);

    /**
     * 获取指定tag下用户的列表
     *
     * @param appId
     * @param tag
     * @return
     */
    Set<String> listTagUser(String appId, String tag);

    /**
     * 添加不存在的tag
     *
     * @param tag
     */
    void addTagNotExist(String appId, String tag);

    /**
     * 设置用户的tags
     *
     * @param appId
     * @param userName
     * @param tags
     */
    void updateUserTags(String appId, String userName, String[] tags);

    /**
     * 添加不存在的group
     *
     * @param appId
     * @param group
     */
    void addGroupNotExist(String appId, String group);

    /**
     * 设置用户的分组信息
     *
     * @param appId
     * @param userName
     * @param group
     */
    void updateUserGroup(String appId, String userName, String group);

    /**
     * 向用户列表中记录新用户
     *
     * @param appId
     * @param userName
     */
    void addUserNotExist(String appId, String userName);

    /**
     * 根据token返回用户
     *
     * @param token
     * @return
     */
    User getUserByToken(String token);

}
